package com.yohann.mycache;

import java.util.*;
import java.util.concurrent.*;

/**
 * @author Yeung Wah
 * @since 2021/5/13
 */
public class MyCache {
    /**
     * 定期删除 线程池
     */
    private static ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(20);

    /**
     * 缓存string
     */
    private static HashMap<String, String> stringMap = new HashMap<>();

    /**
     * 缓存list
     */
    private static HashMap<String, List<?>> listMap = new HashMap<>();

    /**
     * 缓存set
     */
    private static HashMap<String, Set<?>> setMap = new HashMap<>();

    /**
     * 缓存map
     */
    private static HashMap<String, Map<?, ?>> hashMap = new HashMap<>();

    /**
     * string 普通set方法
     */
    public static boolean setString(String key, String string) {
        stringMap.put(key, string);
        return Boolean.TRUE;
    }

    /**
     * list 普通set方法
     */
    public static boolean setList(String key, List<?> list) {
        listMap.put(key, list);
        return Boolean.TRUE;
    }

    /**
     * set 普通set方法
     */
    public static boolean setSet(String key, Set<?> set) {
        setMap.put(key, set);
        return Boolean.TRUE;
    }

    /**
     * map 普通set方法
     */
    public static boolean setMap(String key, Map<?, ?> map) {
        hashMap.put(key, map);
        return Boolean.TRUE;
    }

    /**
     * string 安全set方法
     */
    public static boolean safeSetString(String key, String string) {
        if (stringMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        stringMap.put(key, string);
        return Boolean.TRUE;
    }

    /**
     * list 安全safeSet方法
     */
    public static boolean safeSetList(String key, List<?> list) {
        if (listMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        listMap.put(key, list);
        return Boolean.TRUE;
    }

    /**
     * set 安全set方法
     */
    public static boolean safeSetSet(String key, Set<?> set) {
        if (setMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        setMap.put(key, set);
        return Boolean.TRUE;
    }

    /**
     * map 安全set方法
     */
    public static boolean safeSetMap(String key, Map<?, ?> map) {
        if (hashMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        hashMap.put(key, map);
        return Boolean.TRUE;
    }

    /**
     * string 普通set方法 定期删除
     */
    public static boolean setString(String key, String string, Long delay, TimeUnit unit) {
        stringMap.put(key, string);
        scheduledExecutor.schedule(() -> {
            stringMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * list 普通set方法 定期删除
     */
    public static boolean setList(String key, List<?> list, Long delay, TimeUnit unit) {
        listMap.put(key, list);
        scheduledExecutor.schedule(() -> {
            listMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * set 普通set方法 定期删除
     */
    public static boolean setSet(String key, Set<?> set, Long delay, TimeUnit unit) {
        setMap.put(key, set);
        scheduledExecutor.schedule(() -> {
            setMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * map 普通set方法 定期删除
     */
    public static boolean setMap(String key, Map<?, ?> map, Long delay, TimeUnit unit) {
        hashMap.put(key, map);
        scheduledExecutor.schedule(() -> {
            hashMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * string 安全set方法 定期删除
     */
    public static boolean safeSetString(String key, String string, Long delay, TimeUnit unit) {
        if (stringMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        stringMap.put(key, string);
        scheduledExecutor.schedule(() -> {
            stringMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * list 安全safeSet方法 定期删除
     */
    public static boolean safeSetList(String key, List<?> list, Long delay, TimeUnit unit) {
        if (listMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        listMap.put(key, list);
        scheduledExecutor.schedule(() -> {
            listMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * set 安全set方法 定期删除
     */
    public static boolean safeSetSet(String key, Set<?> set, Long delay, TimeUnit unit) {
        if (setMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        setMap.put(key, set);
        scheduledExecutor.schedule(() -> {
            setMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * map 安全set方法 定期删除
     */
    public static boolean safeSetMap(String key, Map<?, ?> map, Long delay, TimeUnit unit) {
        if (hashMap.containsKey(key)) {
            return Boolean.FALSE;
        }

        hashMap.put(key, map);
        scheduledExecutor.schedule(() -> {
            hashMap.remove(key);
        }, delay, unit);

        return Boolean.TRUE;
    }

    /**
     * string 存在方法
     */
    public static boolean existString(String key) {
        return stringMap.containsKey(key);
    }

    /**
     * list 存在方法
     */
    public static boolean existList(String key) {
        return listMap.containsKey(key);
    }

    /**
     * set 存在方法
     */
    public static boolean existSet(String key) {
        return setMap.containsKey(key);
    }

    /**
     * map 存在方法
     */
    public static boolean existMap(String key) {
        return hashMap.containsKey(key);
    }

    /**
     * string  取值方法
     */
    public static String getString(String key) {
        return stringMap.get(key);
    }

    /**
     * list  取值方法
     */
    public static List getList(String key) {
        return listMap.get(key);
    }

    /**
     * set  取值方法
     */
    public static Set getSet(String key) {
        return setMap.get(key);
    }

    /**
     * map  取值方法
     */
    public static Map getMap(String key) {
        return hashMap.get(key);
    }
}